package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * @author Luka
 * @date 2021/05/28 10:10
 *
 * 通过提高每次读写的数据量,减少实际读写的次数可以提高读写效率
 * 单字节读写是一种随机读写形式
 * 一组字节读写称为块读写
 **/
public class CopyDemo2 {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("D:\\IDEA_WorkSpace\\JSD2104_SE/mariadb-5.5.47-winx64.msi");
        FileOutputStream fos = new FileOutputStream("D:\\IDEA_WorkSpace\\JSD2104_SE/mariadb-5.5.47-winx64_cp3.msi");
               /*
            InputStream和OutputStream中提供了块读写字节的方法

            块读取操作
            int read(byte[] data)
            一次性读取给定字节数组总长度的字节量并存入到数组中，返回值为实际读取到的
            字节数，如果返回值位-1则说明流读取到了末尾。

            例如用文件流读取一个文件:
            文件数据(5字节):
            11001100 11000011 00001111 11110000 10101010

            byte[] data = new byte[3];   {00000000,00000000,00000000}
            int len;

            len = fis.read(data);
                 文件第1个字节   2        3
            data:{11001100 11000011 00001111}
            len:3

            第二次调用:
            len = fis.read(data);
                 文件第4个字节  5        3(原来的数据)
            data:{11110000 10101010 00001111}
            len:2

            第三次调用:
            len = fis.read(data);
            data:{11110000 10101010 00001111}//数组没有变化了
            len:-1



            块写操作
            void write(byte[] data)
            一次性将给定的字节数组中所有字节写出

         */
        /*
            1字节(1byte)   00000000(8位2进制)
            1024byte      1kb
            1024kb        1mb
            1024mb        1gb
            1024gb        1tb

         */

        byte[] data = new byte[1024*10];//10kb
        int len;
        long start = System.currentTimeMillis();
        while((len = fis.read(data)) != -1){
            fos.write(data);
        }
        long ends = System.currentTimeMillis();
        System.out.println("复制完成,耗时"+(ends-start)+"毫秒");
        fis.close();
        fos.close();
    }
}